vt-d: Only setup rmrr identity mappings of the assigned devices
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 28 Dec 2007 15:26:27 +0000 (15:26 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 28 Dec 2007 15:26:27 +0000 (15:26 +0000)
Current implementation setups identity mappings for all the rmrrs
whether the assigned device has rmrr or not. It's wasteful and not
necessary, because only USB controllers and UMA integarated graphics
devices have rmrr. This patch only setups rmrr identity mappings of
the assigned devices. If the assigned devices don't have rmrr, needn't
to setup rmrr identity mapping for guest.

BTW, this patch fixes the VT-d bug (Fail to boot smp Linux guest with
VT-d NIC assigned on IA32e platform).

Signed-off-by: Weidong Han <weidong.han@intel.com>
xen/arch/x86/hvm/vmx/vtd/intel-iommu.c

index 239239ed8e089e44ac3f06f61dc74dcdb451e97f..29f8f195de0a2d6deac6f4bae7c0f99a448d3530 100644 (file)
@@ -1866,14 +1866,17 @@ int assign_device(struct domain *d, u8 bus, u8 devfn)
 
     reassign_device_ownership(dom0, d, bus, devfn);
 
-    /* setup rmrr identify mapping just once per domain */
-    for_each_rmrr_device(rmrr, pdev)
-        ret = iommu_prepare_rmrr_dev(d, rmrr, pdev);
-        if ( ret )
+    /* Setup rmrr identify mapping */
+    for_each_rmrr_device( rmrr, pdev )
+        if ( pdev->bus == bus && pdev->devfn == devfn )
         {
-            gdprintk(XENLOG_ERR VTDPREFIX,
-                     "IOMMU: mapping reserved region failed\n");
-            return ret;
+            ret = iommu_prepare_rmrr_dev(d, rmrr, pdev);
+            if ( ret )
+            {
+                gdprintk(XENLOG_ERR VTDPREFIX,
+                         "IOMMU: mapping reserved region failed\n");
+                return ret;
+            }
         }
     end_for_each_rmrr_device(rmrr, pdev)